代码优雅之道 |
您所在的位置:网站首页 › java double判空 › 代码优雅之道 |
1、前言
实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。 针对异常的处理我们在上一篇有提及: 先来看一下实际项目中一些判空方式 通常我们判断一个对象是否为Null,可以使用java.util中的Objects.nonNull(obj)、hutool中的ObjectUtil或者直接 null != obj 2、List的判空像List这种比较特殊的在项目中可能不仅仅是判断非空了。对于List来说不等于null和List.size()不等于0是两回事,公司也有实习生常常有把这两个混淆的情况,list不等于null说明已经初始化了,堆内存中有一块属于它的地盘,而size为0说明还没往里面放东西,举个例子说就是不等于null代表我现在有个瓶子,size大于0说明我向瓶子里装水了。 实际项目中也发现有直接用list.isEmpty()去判断的,来看一下源码: 相当于判断瓶子里有没有水(前提是瓶子已经存在,若瓶子不存在,则会抛出NullPointerException异常)。 所以通常情况下会连用list != null && list.size > 0 来判断,或者直接使用HuTool中CollUtil工具的isEmpty。诸如此类的还有Set、Map等 3、String的判空这里还是用瓶子与水的概念,String为null时调用equals(String) 或 length() 等操作抛出 java.lang.NullPointerException。 针对字符串判空有以下几种方式: 1、大多数人使用的方法之一,直观,方便,但效率低下: if(a == null || a.equals("")); 2、比较字符串长度,高效: if(a == null || a.length() == 0); 3、Java SE 6.0 才刚刚开始提供,效率和方法二差不多: if(a == null || a.isEmpty()); 当然还可以使用org.apache.commons.lang.StringUtils工具。 StringUtils.isNotBlank(a); * StringUtils.isNotBlank(null) = false * StringUtils.isNotBlank("") = false * StringUtils.isNotBlank(" ") = false * StringUtils.isNotBlank("bob") = true * StringUtils.isNotBlank(" bob ") = true 该工具类中还有个isNotEmpty()方法,从注释可以很明显看出二者的差别 StringUtils.isNotEmpty(a); * StringUtils.isNotEmpty(null) = false * StringUtils.isNotEmpty("") = false * StringUtils.isNotEmpty(" ") = true * StringUtils.isNotEmpty("bob") = true * StringUtils.isNotEmpty(" bob ") = true 4、OptionalOptional的出现就是用来防止NullpointException的。常见的方法有: .empty():创建一个空的Optional实例 .of(T t) : 创建一个Optional 实例,为null时报异常 .ofNullable(T t):若t 不为null,创建Optional 实例,否则创建空实例 isPresent() : 判断容器中是否有值 ifPresent(Consume lambda) :容器若不为空则执行括号中的Lambda表达式 orElse(T t) : 获取容器中的元素,若容器为空则返回括号中的默认值 orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回s 获取的值 orElseThrow() :如果为空,就抛出定义的异常,如果不为空返回当前对象 map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty() flatMap(Function mapper):与map 类似,要求返回值必须是Optional T get() :获取容器中的元素,若容器为空则抛出NoSuchElement异常先看个常见的示例: baseInfo类中有布尔类型的属性,是空返回false,不为空取其值,需要四行。 当使用Optional时,一行搞定,非常的优雅。 场景1:在service层中 查询一个对象,返回之后判断是否为空并做处理 场景2:使用Optional 和函数式编程,一行搞定 每种方法的存在必然有适用的场景,有些情况下这种链式编程,虽然代码优雅了。但是,逻辑性没那么明显,可读性有所降低,大家项目中看情况酌情使用。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |